/* Controlador de Producto : Aqui iran todas las funciones de producto
 Creado por Carlos Pastelin Morales 
 29/12/2014 */
package Controlador;

import Vistas.Interface;
import javax.swing.*;
import Modelo.Producto;
import Modelo.Ventas;
import Vistas.AltaProductos;
import Vistas.BuscarProducto;
import Vistas.ModificaProducto;
import Vistas.factura;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.text.DecimalFormat;
import java.util.Calendar;
import javax.swing.table.DefaultTableModel;

public class SrvProducto extends JFrame {
    /*Inicializamos todas nuestras variables*/

    Producto modelo = new Producto();
    Ventas modeloventa = new Ventas();
    private ResultSet rs;
    private Interface vista;
    private BuscarProducto vistabuscapro;
    private AltaProductos vistaaltaproducto;
    static String aux3;
    public static String id, cad;
    factura Fac = new factura();
    private static float total = 0;
    public static int rowCount, numfac;
    static int w = 0, jj = 0;
    String hora, minutos, segundos, ampm;
    Calendar calendario;
    DecimalFormat format = new DecimalFormat("0.00");//C.P.M Aqui colocamos el formato que tendra los float
    Thread h1;
    private Conexion con;

    public SrvProducto(AltaProductos view) {//C.P.M obtenemos la vista de alta de productos atravez del contructor
        this.vistaaltaproducto = view;//C.P.M y se la asignamos para tener control de ella desde el controlador
    }

    public SrvProducto(Interface view) {//C.P.M Obtenemos la vista de la interface
        this.vista = view;//C.P.M se la asignamso para tener contrl de la vista
    }

    public SrvProducto(BuscarProducto viewbuscar) {//C.P.M Obtenemos la vista de la forma busca producto
        this.vistabuscapro = viewbuscar;//C.P.M Se la asignamos para tener control de ella
    }

    public static float getTotal() {//C.P.M Creamos los sets y gets para resivir el total de la vista 
        return total;
    }

    public static void setTotal(float aTotal) {
        total = aTotal;
    }
    /*Este metodo permite la busqueda de productos*/

    public void buscarproducto() {
        try {
            modelo.setNombre(vista.jTbnombre2.getText());//C.P.M le mandamos al modelo el nombre del producto
            rs = modelo.Buscar();//C.P.M obtenemos el resultado del modelos
            if (rs.equals("")) {//C.P.M en caso de que el resultado venga vacio notificamos a el usuario que no encontro el producto
                JOptionPane.showMessageDialog(null, "No se encontro: " + vista.jTbnombre2.getText() + " en la base de datos.");
            }
            //C.P.M Para establecer el modelo al JTable
            DefaultTableModel buscar = new DefaultTableModel() {
                @Override
                public boolean isCellEditable(int rowIndex, int vColIndex) {//C.P.M Aqui le decimos que no seran editables los campos de la tabla
                    return false;
                }
            };
            vista.jTbuscar.setModel(buscar);//C.P.M le mandamos el modelo
            modelo.estructuraProductos(buscar);//C.P.M Auui obtenemos la estructura de la tabla("Los encabezados")
            ResultSetMetaData rsMd = rs.getMetaData();//C.P.M Obtenemos los metadatos para obtener la cantidad del columnas que llegan
            int cantidadColumnas = rsMd.getColumnCount();//C.P.M la cantidad la alojamos dentro de un entero
            while (rs.next()) {//C.P.M recorremos el resultado 
                Object[] fila = new Object[cantidadColumnas];//C.P.M Creamos un objeto con el numero de columnas
                for (int i = 0; i < cantidadColumnas; i++) {//C.P.M lo recoremos ese vector
                    fila[i] = rs.getObject(i + 1);//C.P.M Aqui vamos insertando la informacion obtenida de la base de datos
                }
                buscar.addRow(fila);//C.P.M y agregamos el arreglo como una nueva fila a la tabla
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Ocurio un error al buscar el producto");
        }

    }
    /*Este es el metodo para consultar productos con alerta de existenica*/

    public void alerta() {
        try {
            rs = modelo.Alerta();//C.P.M consultamos los producto con alerta en existencia
            DefaultTableModel alerta = new DefaultTableModel() {//C.P.M Creamos el modelo de nuestra tabla
                @Override
                public boolean isCellEditable(int rowIndex, int vColIndex) {//C.P.M le decimos que no seran editables los componetnes
                    return false;
                }
            };
            vista.Talertas.setModel(alerta);//C.P.M le mandamos el modelo a la tabla de la vista
            modelo.estructuraAlrta(alerta);//C.P.M obtenemos la estructura de la tabla "los encabezados"
            ResultSetMetaData rsMd = rs.getMetaData();//C.P.M Obtenemos los metadatos para obtener la cantidad del columnas que llegan
            int cantidadColumnas = rsMd.getColumnCount();//C.P.M la cantidad la alojamos dentro de un entero
            while (rs.next()) {//C.P.M recorremos la informacion obtenida
                Object[] fila = new Object[cantidadColumnas];//C.P.M creamos un arreglo con el tamano de el resultado
                for (int i = 0; i < cantidadColumnas; i++) {//C.P.M lo recorremos 
                    fila[i] = rs.getObject(i + 1);//C.P.M y insertamos los valores que trajo del modelo
                }
                alerta.addRow(fila);//C.P.M agregamos el arreglo como una nueva fila dentro de la tabla
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Ocurrio un error al consultar los producto con alerta");
        }
    }
    /*Metodo para buscar un producto por su nombre*/

    public void buscaxnombre() {
        try {
            modelo.setNombre(vistabuscapro.jTvnombre.getText());//C.P.M le mandamos a el modelo el nombre para consultarlo
            rs = modelo.Buscarxnombre();//C.P.M ejecutamo el metodo del modelo y atrapamos el resultado

            DefaultTableModel buscar = new DefaultTableModel() {//C.P.M se establese el modelo de la tabla
                @Override
                public boolean isCellEditable(int rowIndex, int vColIndex) {//C.P.M no sera editable
                    return false;
                }
            };
            vistabuscapro.Tproductos.setModel(buscar);//C.P.M le mandamos el modelo
            modelo.estructuraProductos(buscar);//C.P.M obtenemos la estructura de la tabla "los encabeados"
            ResultSetMetaData rsMd = rs.getMetaData();//C.P.M obtenemos los metadatos de el resultado
            int cantidadColumnas = rsMd.getColumnCount();//C.P.M obtenemos la cantidad de columnas
            while (rs.next()) {//C.P.M recorremos el resultado
                Object[] fila = new Object[cantidadColumnas];//C.P.M creamos un objeto con la cantidad de columnas obtenidas
                for (int i = 0; i < cantidadColumnas; i++) {//C.P.M lo recorremos
                    fila[i] = rs.getObject(i + 1);//C.P.M le agregamos la informacion obtenida
                }
                buscar.addRow(fila);//C.P.M lo agregamos a la tabla como una nueva fila
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Ocurrio un error al buscar por nombre");
        }
    }
    /*Metodo para buscar por descripcion del producto*/

    public void buscarxdescrip() {
        try {
            modelo.setDescripcion(vista.jTbdescripcion.getText());//C.P.M le enviamos al modelo la descripcion y consultamos
            rs = modelo.Buscarxdescrip();//C.P.M cachamos el resultado de la consulta

            DefaultTableModel buscar = new DefaultTableModel() {//C.P.M creamos el modelo de la tabla
                @Override
                public boolean isCellEditable(int rowIndex, int vColIndex) {
                    return false;
                }
            };
            vista.jTbuscar.setModel(buscar);//C.P.M le mandamos el modelo a la tabla
            modelo.estructuraProductos(buscar);//C.P.M obtenemos la estructura de la tabla "encabezados"
            ResultSetMetaData rsMd = rs.getMetaData();//C.P.M obtenemos los metadatos de la consulta
            int cantidadColumnas = rsMd.getColumnCount();//C.P.M obtenemos la cantidad de columnas de la consulta
            while (rs.next()) {//C.P.M recorremos el resultado
                Object[] fila = new Object[cantidadColumnas];//C.P.M creamos un arreglo con una dimencion igual a la cantidad de columnas
                for (int i = 0; i < cantidadColumnas; i++) { //C.P.M lo recorremos 
                    fila[i] = rs.getObject(i + 1); //C.P.M vamos insertando los resultados dentor del arreglo
                }
                buscar.addRow(fila);//C.P.M y lo agregamos como una nueva fila a la tabla
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Ocurrio un error al buscar producto por descripcion");
        }
    }
    /*Metodo para agregar un producto por codigo de barras a la venta*/

    public void AgregarVenta() {
        if (vista.jTcodigodebarras.equals("")) {//C.P.M si el componete esta vacio es que no a insertado algun codigo a buscar
            JOptionPane.showMessageDialog(null, "No has ingresado un codigo de barras");//C.P.M se lo notificamos a el usuario
        } else {//C.P.M de lo contrario es que inserto algo y ay que buscarlo
            try {
                modelo.setCodigobarras(vista.jTcodigodebarras.getText());//C.P.M le mandamos el codigo a buscar a el modelo
                rs = modelo.Buscarcodigobarras();//C.P.M cachamos el resultado de la consulta
                if (rs.next() == true) {//C.P.M preguntamos si trai datos si es asi 
                    String nombre = rs.getString("nombre_producto");//C.P.M obtenemos el nombre de el resultado
                    float precio = Float.parseFloat(rs.getString("precio"));//C.P.M obtenemos el precio
                    String precioformato = format.format(precio);//C.P.M le damos el formato adecuado esta variable la utilizamos para enviarla a la vista
                    float totalPro = Float.parseFloat(precioformato);//C.P.M cambiamos a flotante ya el precio con el formato adecuado
                    String cant = JOptionPane.showInputDialog(null, "Cantidad: ");//C.P.M preguntamos la cantidad del prducto
                    float cantidad = Float.parseFloat(cant);//C.P.M convertimos a flotante la cantidad
                    totalPro = totalPro * cantidad;//C.P.M obtenemos el total de ese producto multiplicando al cantidad por el precio
                    total = Float.parseFloat(vista.jTtotal.getText());//C.P.M obtenemos el total de la venta 
                    total = totalPro + total;//C.P.M le sumamos el total del producto ingresado al total ya de la venta
                    String totalaenviar = format.format(total);//C.P.M le damos el formato adecuado para enviar el nuevo total
                    vista.jTtotal.setText(totalaenviar);//C.P.M le enviamos el nuevo total a la vista
                    DefaultTableModel temp = (DefaultTableModel) vista.Tlista.getModel();//C.P.M obtenemos el modelo de la tabla
                    Object[] fila = new Object[3];//C.P.M creamos un areglo con el tamano de la nota
                    fila[0] = cant;//C.P.M le agregamos la cantidad 
                    fila[1] = nombre;//C.P.M le agregamos el nombre
                    fila[2] = precioformato;//C.P.M y el precio con el formato
                    temp.addRow(fila);//C.P.M lo agregamos a la tabla como una nueva fila
                } else {
                    JOptionPane.showMessageDialog(null, "No existe un artículo con dicho código");
                }
                vista.jTcodigodebarras.setText("");//C.P.M limpiamos el codigo de barras y le colocamos el foco
                vista.jTcodigodebarras.requestFocus();//C.P.M le colocamos el foco
            } catch (SQLException ex) {//C.P.M si ocurre un error le notificamos a el usuario
                JOptionPane.showMessageDialog(null, "Ocurrio un error al consultar el codigo de barras");
            }
        }
    }
    /*Modulo de alerta de existencia */

    public void alertasexistencia() {
        try {
            rs = modelo.alertaexistenciapro();//C.P.M consultamos los producto con alerta en existencia
            DefaultTableModel tabla = new DefaultTableModel() {//C.P.M creamos el modelo de la tabla
                @Override
                public boolean isCellEditable(int rowIndex, int vColIndex) {
                    return false;
                }
            };
            vista.Talertas.setModel(tabla);//C.P.M le mandamos el modelo
            modelo.estructuraAlrta(tabla);//C.P.M obtenemos la estructura de la tabla "los encabezados"
            ResultSetMetaData rsMd = rs.getMetaData();//C.P.M obtenemos los metadatos de la consulta
            int cantidadColumnas = rsMd.getColumnCount();//C.P.M obtenemos la cantidad de las columnas de la consulta
            while (rs.next()) {
                Object[] fila = new Object[cantidadColumnas];//C.P.M creamos un arreglo con la cantidad de columnas 
                for (int i = 0; i < cantidadColumnas; i++) {//C.P.M lo recorremos 
                    fila[i] = rs.getObject(i + 1);//C.P.M  y agregamos la informacion de la consulta
                }
                tabla.addRow(fila);//C.P.M  lo agregamos a la tabla como una nueva fila
            }
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Ocurrio algun error al consultar las alertas");
        }
    }
    /*Modulo para modificar el producto*/

    public void modificar() {

        ModificaProducto modprodu = new ModificaProducto(vista, true);//C.P.M  instanciamos la forma de modificar producto en modo modal y le mandamos al vista 
        int Opcion = vista.jTbuscar.getSelectedRow();//C.P.M obtenemos los datos de la fila la cual este seleccionada
        modprodu.id = vista.jTbuscar.getValueAt(Opcion, 0).toString();//C.P.M se los mandamos a la forma dentro de sus campos
        modprodu.jTbcodigobarras.setText(vista.jTbuscar.getValueAt(Opcion, 1).toString());
        modprodu.jTproducto.setText(vista.jTbuscar.getValueAt(Opcion, 2).toString());
        modprodu.jTbprecio.setText(vista.jTbuscar.getValueAt(Opcion, 3).toString());
        modprodu.jTbcaducidad.setText(vista.jTbuscar.getValueAt(Opcion, 4).toString());
        modprodu.jTbexistencia.setText(vista.jTbuscar.getValueAt(Opcion, 5).toString());
        modprodu.jTbdescripcion2.setText(vista.jTbuscar.getValueAt(Opcion, 6).toString());
        modprodu.jTbespecificaciones.setText(vista.jTbuscar.getValueAt(Opcion, 7).toString());
        modprodu.setLocationRelativeTo(vista);//C.P.M  centramos la forma a la vista
        modprodu.setVisible(true);//C.P.M  y la asemos visible
    }
    /*Metodo para factura de venta o nota de venta*/

    public void facturaventa() {
        if (vista.Tlista.getRowCount() == 0) {//C.P.M Preguntamos si ay articulos en la tabla de venta
            JOptionPane.showMessageDialog(null, "No hay ningun elemento  en la tabla de venta");//C.P.M Si no hay elementos en la tabla
        } else {
            try {
                rowCount = vista.Tlista.getRowCount(); //C.P.M guardamos el numero de articulos en la tabla de la venta
                numfac = 1;//C.P.M  inicializamos el numero de la factura en 1 
                rs = modeloventa.Facturaventa();//C.P.M  Consultamos el numero de facturas 
                while (rs.next()) {//C.P.M recorremos la consulta 
                    numfac++;//C.P.M  y incrementamos nustra variable para obtener el numero de la factura siguiente
                }
                Fac.setNum(numfac);//C.P.M  le enviamos el numero de la factura siguiente
                JTable t = Fac.getTabla();//C.P.M  inicializamos una tabla
                for (int k = 0; k < vista.Tlista.getRowCount(); k++) {//C.P.M recoremos la tabla 
                    t.setValueAt(vista.Tlista.getValueAt(k, 0), k, 0);//C.P.M y vamos agregando los productos que tenemos en venta
                    t.setValueAt(vista.Tlista.getValueAt(k, 1), k, 1);
                    t.setValueAt(vista.Tlista.getValueAt(k, 2), k, 2);
                }
                Fac.setTabla(t);//C.P.M enviamos la tabla a la forma de factura
                Fac.setTotal(vista.jTtotal.getText());//C.P.M enviamos el total
                Fac.setVisible(true);//C.P.M y asemos visible la tabla
            } catch (SQLException ex) {//C.P.M Si ocurre algun error lo notificamos
                JOptionPane.showMessageDialog(null, "Ocurrio un error al generar la factura");
            }
        }
    }
    /*Este metodo su funcion es limpiar la nota de venta*/

    public void limpiarcarrito() {
        setTotal(0);//C.P.M limpiamos el total
        vista.jTtotal.setText("0.00");//C.P.M limpiamos la caja de texto con el formato adecuado
        int x = vista.Tlista.getRowCount() - 1;//C.P.M inicializamos una variable con el numero de columnas
        {
            try {
                DefaultTableModel temp = (DefaultTableModel) vista.Tlista.getModel();//C.P.M obtenemos el modelo actual de la tabla
                while (x >= 0) {//C.P.M la recorremos
                    temp.removeRow(x);//C.P.M vamos removiendo las filas de la tabla
                    x--;//C.P.M y segimos disminuyendo para eliminar la siguiente 
                }
            } catch (ArrayIndexOutOfBoundsException e) {
                JOptionPane.showMessageDialog(null, "Ocurrio un error al limpiar la venta");
            }
        }
    }
    /*Esta funcion realiza un busqueda por codigo de barras*/

    public void buscaxcodigo() {
        try {
            modelo.setCodigobarras(vista.jTbcodigobarras.getText());//C.P.M mandamos el codigo de barras ingresado
            rs = modelo.Buscarxcodigobarras();//C.P.M mandamos a consultar ese codigo de barras
            DefaultTableModel buscar = new DefaultTableModel() {//C.P.M instanciamos el modelo de la tabla
                @Override
                public boolean isCellEditable(int rowIndex, int vColIndex) {
                    return false;
                }
            };
            vista.jTbuscar.setModel(buscar);//C.P.M le mandamos el modelo a la tabla
            modelo.estructuraProductos(buscar);//C.P.M obtenemos la estructura de la tabla "Encabezados"
            ResultSetMetaData rsMd = rs.getMetaData();//C.P.M obtenemos los metadatos de la consulta
            int cantidadColumnas = rsMd.getColumnCount();//C.P.M obtenemos las columnas de la consulta

            while (rs.next()) {//C.P.M recorremos el resultado
                Object[] fila = new Object[cantidadColumnas];//C.P.M  creamos un vector con el tamano de las columnas de el resultado
                for (int i = 0; i < cantidadColumnas; i++) {//C.P.M  recorremos el arreglo
                    fila[i] = rs.getObject(i + 1);//C.P.M  y vamos insertando el resultado
                }
                buscar.addRow(fila);//C.P.M  le mandamos el arreglo como renglon nuevo
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Ocurrio un error al buscar por codigo de barras");
        }
    }
    /*Metodo la insertar un producto*/

    public void ingresarproducto() {
        String Error;//C.P.M  Creamos una variable para obtener algun error 
        /*Preguntamos si todos los campos estan llenos sino lo notificamos*/
        if (vistaaltaproducto.jTnombre.getText().equals("") || vistaaltaproducto.jTyyyy.getText().equals("") || vistaaltaproducto.jTprecio.getText().equals("")
                || vistaaltaproducto.jTexistencia.getText().equals("") || vistaaltaproducto.jTdescripcion.getText().equals("") || vistaaltaproducto.jTespecificaciones.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Faltan datos: No puede dejar cuadros en blanco");
        } else {
            modelo.setCodigobarras(vistaaltaproducto.jTcodigobarras.getText());//C.P.M enviamos todos los datos a el modelo
            modelo.setNombre(vistaaltaproducto.jTnombre.getText());
            modelo.setCaducidad(vistaaltaproducto.jTyyyy.getText() + "-" + vistaaltaproducto.jTmm.getText() + "-" + vistaaltaproducto.jTdd.getText());
            modelo.setExistencia(vistaaltaproducto.jTexistencia.getText());
            modelo.setPrecio(vistaaltaproducto.jTprecio.getText());
            modelo.setDescripcion(vistaaltaproducto.jTdescripcion.getText());
            modelo.setEspecifica(vistaaltaproducto.jTespecificaciones.getText());
            Error = modelo.insertar();//C.P.M ejecutamos el metodo del modelo para insertar y esperamos algn error
            if (Error.equals("")) {//C.P.M  si error llega vacio es que todo salio bien
                JOptionPane.showMessageDialog(null, "Producto: " + vistaaltaproducto.jTnombre.getText() + " agregado.");//C.P.M  lo notificamos
                vistaaltaproducto.jTnombre.setText("");//C.P.M limpiamos los campos 
                vistaaltaproducto.jTcodigobarras.setText("");
                vistaaltaproducto.jTprecio.setText("");
                vistaaltaproducto.jTyyyy.setText("");
                vistaaltaproducto.jTmm.setText("");
                vistaaltaproducto.jTdd.setText("");
                vistaaltaproducto.jTexistencia.setText("");
                vistaaltaproducto.jTdescripcion.setText("");
                vistaaltaproducto.jTespecificaciones.setText("");
                vistaaltaproducto.jTnombre.requestFocus();//C.P.M  y ponemos el foco en el primer componente
            } else {
                JOptionPane.showMessageDialog(null, Error);//C.P.M  de lo contrario notificamos el error
            }
        }
    }
}
